package com.divemotor.ventarepuestosinternet.dao.impl;


import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;


import com.divemotor.ventarepuestosinternet.dao.UsuarioDAO;
import com.divemotor.ventarepuestosinternet.model.Usuario;


@SuppressWarnings("unchecked")
@Repository (value = "usuarioDAO")
public class UsuarioDAOImpl implements UsuarioDAO, Serializable {
	
	private static final long serialVersionUID = 548640635129039483L;
	
	@Autowired
	private SessionFactory sessionFactory;
	
	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}
	
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
	
	@Override
	public void insertar(Usuario usuario) {
		getSessionFactory().getCurrentSession().persist(usuario);
	}
	
	@Override
	public void actualizar(Usuario usuario) {
		 getSessionFactory().getCurrentSession().merge(usuario);
	}
	
	@Override
	public void eliminar(Usuario usuario)  {
		getSessionFactory().getCurrentSession().merge(usuario);
	}
	
	@Override
	public Usuario obtenerPorId(Usuario usuario) {
		return (Usuario)getSessionFactory().getCurrentSession().get(Usuario.class,usuario.getIdUsuario());
	}

	@Override
	public Usuario obtenerPorUsuarioLogin(Usuario usuario)  {
		Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Usuario.class);
		criteria.add(Restrictions.eq("usuario", usuario.getUsuario()).ignoreCase());
        return (Usuario)criteria.uniqueResult();
	}
	
	@Override
	public List<Usuario> listar() {
		List<Usuario> lista = getSessionFactory().getCurrentSession().createQuery("from Usuario").list();
		return lista;
	}
	
	@Override
	public List<Usuario> listarPorPropiedad(String propiedad, Object value) {
		return sessionFactory.getCurrentSession().createCriteria(Usuario.class)
							 .add(Restrictions.eq(propiedad, value).ignoreCase()).list();
	}
	
	@Override
	public Usuario obtenerPorUsuarioLoginYPais(Usuario usuario){
		return (Usuario) getSessionFactory().getCurrentSession().createQuery("FROM Usuario u WHERE lower(u.usuario) = lower(:usuario) AND u.pais.idPais =:idPais")
												.setParameter("usuario", usuario.getUsuario())
												.setParameter("idPais", usuario.getPais().getIdPais()).uniqueResult();
	}

	@Override
	public void actualizarUsuarioExistente(Usuario usuario) {
		getSessionFactory().getCurrentSession().merge(usuario); 
		getSessionFactory().getCurrentSession().flush();
	}

	@Override
	public Usuario obtenerListadePerfiles(Usuario usuario) {
		Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Usuario.class);
		criteria.add(Restrictions.eq("idUsuario", usuario.getIdUsuario()));
		criteria.add(Restrictions.eq("pais", usuario.getPais()));
		return (Usuario)criteria.uniqueResult();
	}
	
}
